perm filename MEM[G,BGB] blob sn#087658 filedate 1974-02-21 generic text, type C, neo UTF8
COMMENT ⊗   VALID 00007 PAGES
C REC  PAGE   DESCRIPTION
C00001 00001
C00002 00002	TITLE MEM	MEMORY MANAGEMENT ROUTINES.
C00005 00003	SUBR(MKCAMERA,WORLD)
C00007 00004	SUBR(MKWINDOW,CAMERA,WINDOW)	MAKE AND LINK A WINDOW NODE.
C00009 00005		FAIL MORE CORE.
C00011 00006		SAIL MORE CORE.
C00013 00007	SUBRS MKNODE,KLNODE	MAKE AND KILL NODES.
C00022 ENDMK
C⊗;
TITLE MEM	;MEMORY MANAGEMENT ROUTINES.
	INTERN OLD44,UNIVER,BLKCNT,AVAIL,INVALID
	EXTERN REL	;RELOCATION BIT TABLE.

	OLD44:	0	;ORIGINAL JOBREL 44 CONTENTS.
	UNIVER:	0	;POINTER TO UNIVERSE NODE.
	BLKCNT: 0	;NUMBER OF NON EMPTY NODES.
	AVAIL:	0	;POINTER TO FIRST EMPTY NODE.
	REMAINDER:0	;NUMBER OF UNUSED WORDS BETWEEN 
			; THE TOP OF NODE SPACE AND THE TOP OF CORE.
	INVALID:0	;SET DURING SHRINK

	NODSIZ←←=12	;NUMBER OF WORDS PER NODE.
	MINLINK←←-3	;LOWEST NUMBERED LINK
	TYPMASK←←17	;MASK TO EXTRACT TYPE INFORMATION

SUBR(MKUNIV)		;MAKE UNIVERSE.
COMMENT ⊗------------------------------------------------------------
⊗
	SETQ(WORLD,{MKWORLD})		;MAKE A WORLD  FOR THIS UNIVERSE.
	SETQ(CAMERA,{MKCAMERA,WORLD})	;MAKE A CAMERA FOR THIS WORLD.
 	SETQ(SUN,{MKCAMERA,[0]})	;MAKE A SUN (LIKE A CAMERA).
	MOVEI $SUN↔DAP(1)		;MARK THE NODE AS SUN TYPE.
	FRAME 2,1↔LAC[100.0]↔DAC ZWC(1)	;PLACE SUN A HUNDRED FEET UP.
	LAC 2,WORLD↔ALT. 1,2↔PWRLD. 2,1	;PLACE THE SUN IN THE WORLD.
	CALL(MKWINDOW,CAMERA,[0])	;MAKE A WINDOW FOR THIS CAMERA.
	POP0J
DECLARE{WORLD,CAMERA,SUN}
ENDR MKUNIV;7/12/73(BGB)---------------------------------------------

SUBR(MKWORLD)		;MAKE A WORLD NODE.
COMMENT ⊗------------------------------------------------------------
⊗
	SETQ(WORLD#,{MKNODE,[PBIT+$WORLD]})
	CW. 1,1↔CCW. 1,1		;EMPTY BODY RING.
	BRO. 1,1↔SIS. 1,1		;WORLD RING.
	CALL(MKFRAME↑)			;WORLD FRAME OF REFERENCE.
	LAC 2,WORLD
	FRAME. 1,2

;PLACE NEW WORLD AT THE END OF THE WORLD RING.
	LAC 1,WORLD
	LAC 4,UNIVERSE↔PWRLD 2,4  ;GET FIRST WORLD OF THIS UNIVERSE.
 	JUMPN 2,.+4
	NWRLD. 1,4↔PWRLD. 1,4	;INIT THE UNIVERSE'S WORLD RING.
	POP0J
	BRO  3,2
	BRO. 1,2↔SIS. 2,1	;RING-IN THE NEW WORLD.
	SIS. 1,3↔BRO. 3,1
	POP0J

ENDR MKWORLD;3/12/73(BGB)--------------------------------------------
SUBR(MKCAMERA,WORLD)
COMMENT ⊗------------------------------------------------------------
If WORLD argument is not zero then place camera in world's camera ring.
⊗
	SETQ(CAMERA#,{MKNODE,[PBIT+$CAMERA]})
	BRO. 1,1↔SIS. 1,1		;CAMERA RING.
	SKIPE 2,WORLD↔PWRLD. 2,1	;CAMERA POINTS AT ITS WORLD.

;DEFAULT PHYSICAL RASTER SIZE.
	DEFINE MM{3.280833E-3}
	DEFINE MICRON{3.280833E-6}
	LAC[38.78]↔FMPR[MICRON]↔DAC 1(1)	;PDX.
	LAC[40.00]↔FMPR[MICRON]↔DAC 2(1)	;PDY.
	LAC[12.50]↔FMPR[MM]↔    DAC 3(1)	;FOCAL

	MOVN 3(1)↔FDVR 1(1)↔DAC -3(1)		;SCALEX ← -FOCAL/PDX
	MOVN 3(1)↔FDVR 2(1)↔DAC -2(1)		;SCALEY ← -FOCAL/PDY
	MOVN 3(1)↔FDVR 2(1)↔DAC -1(1)		;SCALEZ ← -FOCAL/PDZ

;CAMERA LOCUS AND ORIENTATION.

	CALL(MKFRAME↑)
	LAC[16.0]↔DAC ZWC(1)		;16 FEET ABOVE XY PLANE.
	LAC 2,CAMERA↔FRAME. 1,2

;PLACE NEW CAMERA AT THE END OF THE WORLD'S CAMERA RING.
	LAC 1,CAMERA
	LAC 4,WORLD↔PCAMR 2,4  ;GET FIRST CAMERA OF THIS WORLD.
 	JUMPN 2,.+4
	NCAMR. 1,4↔PCAMR. 1,4	;INIT THE WORLD'S CAMERA RING.
	POP1J
	BRO  3,2
	BRO. 1,2↔SIS. 2,1	;RING-IN THE NEW CAMERA.
	SIS. 1,3↔BRO. 3,1↔POP1J

ENDR MKCAMERA;3/12/73(BGB)-------------------------------------------
SUBR(MKWINDOW,CAMERA,WINDOW)	;MAKE AND LINK A WINDOW NODE.
COMMENT ⊗------------------------------------------------------------
CAMERA argument may be zero.
Zero WINDOW argument will cause a new Display ring;
Otherwise new window placed into the display ring of the given window.
⊗
	CALL(MKNODE,[PBIT+$WINDOW])
	LAC[3.5]↔DAC -1(1)			;MAG
	LAC[XWD -=511,=511]↔DAC 1(1)		;XWD XL,,XH
	LAC[XWD -=384,=384]↔DAC 2(1)		;XWD YL,,YH

	LAC CAMERA↔NCAMR. 0,1	;POINTER TO CAMERA.

	BRO. 1,1↔SIS. 1,1	;WINDOW RING.
	CW.  1,1↔CCW. 1,1	;DISPLAY RING.

;PLACE NEW WINDOW IN DISPLAY RING NEXT TO GIVEN WINDOW.

	SKIPN 2,WINDOW↔GO L1
	PVT 0,2↔AOS↔PVT. 0,1	;INCREMENT SERIAL NUMBER.
	SIS 3,2
	SIS. 1,2↔BRO. 2,1
	BRO. 1,3↔SIS. 3,1↔POP2J

;PLACE NEW WINDOW IN BRAND NEW DISPLAY RING, ALL BY ITSELF.
L1:	AOS 3(1)		;SERIAL NUMBER #1.
	LAC 4,UNIVERSE↔CCW 2,4	;GET FIRST DISPLAY RING.
	CW. 1,4↔CCW. 1,4	;UPDATE UNIVERSE NODE.
	JUMPE 2,POP2J.		;EXIT WHEN FIRST DISPLAY RING.
	CW 3,2
	CW. 1,2↔CCW. 2,1	;RING-IN A NEW DISPLAY RING.
	CCW. 1,3↔CW. 3,1
	POP2J

ENDR MKWINDOW;3/12/73(BGB)-------------------------------------------
	;FAIL MORE CORE.
IFE SAIL{
SUBR(MORCOR)		;Get more core			*
COMMENT ⊗------------------------------------------------------------
⊗
;INITIALIZE THE UNIVERSE NODE WHEN NECESSARY.
	SKIPE OLD44↔GO L1		;SKIP ON FIRST TIME ONLY.
	LAC 1,44↔DAC 1,OLD44		;SAVE JOBREL.
	ADDI 1,1↔			;SETUP UNIVERSE NODE.
	ADDI 1,1↔DAC 1,AVAIL
	ADDI 1,1↔DAC 1,BLKCNT
	ADDI 1,1↔DAC 1,UNIVERSE
	SETZM REMAINDER

;FOUR MORE K.
L1:	LAC 1,44↔LAC 0,1↔ADDI 0,10000
	CORE↔FATAL<NO MORE CORE.>
	AOS 1↔SUB 1,REMAINDER
	DAC 2,AC2#↔LAC 2,44
	SETZM(1)↔HRLI(1)↔HRRI(1)1↔BLT(2)
	MOVEI 2↔DAP @UNIVERSE		;UNIVERSE NODE IS TYPE #2.

;MAKE AVAIL LIST.
	DIP 1,1↔ADD 1,[XWD NODSIZ,0]
	SKIPN@BLKCNT↔GO[
		ADD 1,[XWD NODSIZ,NODSIZ]
		AOS@BLKCNT↔GO .+1]
	HRRZM 1,@AVAIL
L2:	HLRZM 1,(1)↔AOS 3(1)		;EMPTY LINK & EMPTY NODE TYPE #1.
	ADD 1,[XWD NODSIZ,NODSIZ]
	CAILE 2,NODSIZ+NODSIZ-1(1)
	GO L2↔AOS 3(1)

	SUBI 2,NODSIZ-1(1)↔DAC 2,REMAINDER
	MOVEI 10000↔LAC 1,UNIVER↔ADDM -3(1)	;CORE SIZE.
	LAC 1,@AVAIL
	LAC 2,AC2↔POP0J
ENDR MORCOR;4-DEC-72(BGB)
}
	;SAIL MORE CORE.
IFN SAIL{
SUBR(MORCOR)------------------------------------------------------
	ACCUMULATORS{PTR,SIZ}
; - GET MORE CORE FROM SAIL - BGB - 8 MARCH 1972.
	PUSH P,PTR↔PUSH P,SIZ
	SETZ PTR,
L1:	MOVEI SIZ,NODSIZ*=400+1		;AC3 SIZE OF SPACE.
	CALL(CORGET↑)			;AC2 ADDRESS OF SPACE.
	GO[FATAL(NO MORE CORE.)]↔SOS SIZ
	MOVSI(PTR)↔HRRI 1(PTR)↔SETZM(PTR)	;CLEAR 4K BLOCK OF MEMORY.
	BLT NODSIZ*=400-1(PTR)		;CLEAR 4K BLOCK OF MEMORY.
	LAC 1,PTR			;-3 WORD OF FIRST NODE.

;INITIALIZE THE UNIVERSE WHEN NECESSARY.
	SKIPE UNIVER↔GO L3
	ADDI 1,1↔DAC 1,AVAIL		;POINTER TO AVAIL LIST.
	ADDI 1,1↔DAC 1,BLKCNT		;POINTER TO NODE COUNT.
	ADDI 1,1↔DAC 1,UNIVERSE		;POINTER TO UNIVERSE NODE.
	MOVEI 2↔DAP@UNIVERSE		;UNIVERSE NODE IS TYPE #2.

;MAKE AVAIL LIST.
L3:	DIP 1,1↔ADD 1,[XWD NODSIZ,0]		;XWD NEXT,,THIS
	SKIPN@BLKCNT↔GO[
		ADD 1,[XWD NODSIZ,NODSIZ]     	;STEP OVER UNIVERSE.
		AOS@BLKCNT↔SUBI SIZ,NODSIZ↔GO .+1]
	SUBI SIZ,NODSIZ
	HRRZM 1,@AVAIL

;PLACE EACH NEW EMPTY BLOCK ON THE AVAIL LIST.
L2:	HLRZM 1,(1)↔AOS 3(1)		;EMPTY LIST POINTER & TYPE #1.
	ADD 1,[XWD NODSIZ,NODSIZ]
	SUBI SIZ,NODSIZ
	JUMPG SIZ,L2↔AOS 3(1)

	LAC 1,@AVAIL
	POP P,3↔POP P,2↔POP0J
ENDR MORCOR;------------------------------------------------------
}
;SUBRS MKNODE,KLNODE	;MAKE AND KILL NODES.
;--------------------------------------------------------------------

SUBR(MKNODE,NODTYP)		;ALLOCATE A BLOCK OF NODSIZ WORDS.
	SKIPN 1,@AVAIL↔CALL(MORCOR)	;GET AN EMPTY NODE.
	CDR(1)↔DAP @AVAIL
	SETZM(1)↔AOS @BLKCNT↔ADDI 1,3
	LAC NODTYP↔DAC(1)		;PLACE NODE TYPE INTO NODE.
	POP1J
ENDR MKNODE;12/4/72(BGB)---------------------------------------------

SUBR(KLNODE,NODE)		;RELEASE  BLOCK OF NODSIZ WORDS.
	LAC 1,NODE↔LAC (1)
	CAIN 0,1↔GO[FATAL(KILLING EMPTY NODE.)]
	SOS @BLKCNT
	HRLI -3(1)↔HRRI -2(1)		;CLEAR NODE.
	SETZM -3(1)↔BLT 8(1)
	AOS(1)				;MARK NODE TYPE EMPTY-1.
	SUBI 1,3↔LAC@AVAIL		;CONS NODE TO AVAIL LIST.
	HRRZM(1)↔HRRZM 1,@AVAIL
	POP1J
ENDR KLNODE;12/4/72(BGB)---------------------------------------------
END